package chapter14.interfaces;

import java.lang.reflect.Method;

/**
 * @author : DuJiabao
 * @Date : 2021/3/4 9:40
 * @Project : thinking_in_java
 * @File : null.java
 * @Desc :
 */
public class HiddenImplementation {
  public static void main(String[] args) throws Exception {
    A a = HiddenC.makeA();
    a.f();
    // a.g();  // 编译失败
    //(C)a;  // 转型失败
    System.out.println(a instanceof C);  // true

    // 通过反射，都可以用！！
    callHiddenMethod(a, "f");
    callHiddenMethod(a, "g");
    callHiddenMethod(a, "u");
    callHiddenMethod(a, "v");
    callHiddenMethod(a, "w");
  }

  /**
   * 通过反射调用方法
   * @param a 对象
   * @param methodName 方法名
   * @throws Exception 抛出异常
   */
  static void callHiddenMethod(Object a, String methodName) throws Exception {
    Method g = a.getClass().getDeclaredMethod(methodName);  // 获取方法
    g.setAccessible(true);  // 设置方法是可触及的
    g.invoke(a);  // 调用方法
  }
}
